﻿package MDVRPTW;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;

public class Load {
	
	//顾客情况集合
	private LinkedList<Customer> customers = new LinkedList<Customer>();
	//车场情况集合
	private LinkedList<Deport> deports = new LinkedList<Deport>();
	private int carNum;
	private int deportNum;
	private int csmNum;
	private double limitLoad;
	private double limitCapacity=10.0;//车辆最大体积，由于测试用例没有约束体积，简单设为10，不影响算法计算
	private double limitTime;
	public LinkedList<Customer> getCustomers() {
		return customers;
	}

	public LinkedList<Deport> getDeports() {
		return deports;
	}

	public int getCarNum() {
		return carNum;
	}

	public double getLimitCapacity() {
		return limitCapacity;
	}

	public double getLimitTime() {
		return limitTime;
	}

	public double getLimitLoad() {
		return limitLoad;
	}

	public int getDeportNum() {
		return deportNum;
	}

	public int getCsmNum() {
		return csmNum;
	}


	//文件夹路径(相对路径)
	private static String tpath1="TestCase/";
	//文件路径
	private static String tpath2="pr01";
	
	
	
	public Load(String path2) throws IOException {
		//声明文件读取器
		FileReader input;
		//以字节流形式读取文件
		BufferedReader br = null;
		try{
			int a=1;//由于文件读取过程中，顾客和车场ID如果上三位数，每列第一个字符将不是空格，用这个做标志位，一旦读取第一个字符不是空格，则a变回0，保证正常读取；
			input=new FileReader(tpath1+path2);
			br = new BufferedReader(input);
			//声明保存一行的变量，并读出第一行
			String line = br.readLine();
			//声明保存读出一行的数组
			String[] lineArray=line.split("\\s+");
			
			//数组第二位表示该测试用例中的每个车场车辆数
			carNum=Integer.parseInt(lineArray[1]);
			//数组第三位表示该测试用例中的顾客数
			csmNum=Integer.parseInt(lineArray[2]);
			//数组第四位表示该测试用例中的车场数
			deportNum=Integer.parseInt(lineArray[3]);
			
			//------------------------------------------------------------------------------------
			//由于同一车型且各车场车辆数目相同，接下来的车场数目行均为相同内容
			for(int i=0;i<deportNum;i++){
				line=br.readLine();
			}
			lineArray=line.split("\\s+");
			//数组第一位表示该测试用例中的车辆最长服务时间
			limitTime=Double.parseDouble(lineArray[0]);
			//数组第一位表示该测试用例中的车辆最大负重
			limitLoad=Double.parseDouble(lineArray[1]);
			
			//------------------------------------------------------------------------------------
			//接下的csmNum行均为各顾客的信息
			for(int i=0;i<csmNum;i++){
				line=br.readLine();
				lineArray=line.split("\\s+");
				Customer newCsm=new Customer();
				if(lineArray[0].trim().equals("")){
					a=1;
				}
				else{
					a=0;
				}
				newCsm.setNum(Integer.parseInt(lineArray[a+0]));//客户编号
				newCsm.setX(Double.parseDouble(lineArray[a+1]));//客户位置X坐标
				newCsm.setY(Double.parseDouble(lineArray[a+2]));//客户位置Y坐标
				newCsm.setServiceTime(Double.parseDouble(lineArray[a+3]));//客服服务时间
				newCsm.setWeight(Double.parseDouble(lineArray[a+4]));//客服物件重量
				newCsm.setVolume(0);//客服物件体积测试用例中没有,设为0
				newCsm.setEST(Double.parseDouble(lineArray[a+11]));//最早服务时间
				newCsm.setLST(Double.parseDouble(lineArray[a+12]));//最晚服务时间
				
				customers.add(newCsm);
			}
			
			//------------------------------------------------------------------------------------
			//接下来的deportNum行均为各车场的信息
			for(int i=0;i<deportNum;i++){
				line=br.readLine();
				lineArray=line.split("\\s+");
				if(lineArray[0].trim().equals("")){
					a=1;
				}
				else{
					a=0;
				}
				Deport newDep=new Deport();
				newDep.setNum(Integer.parseInt(lineArray[a+0]));//车场编号
				newDep.setX(Double.parseDouble(lineArray[a+1]));//车场位置X坐标
				newDep.setY(Double.parseDouble(lineArray[a+2]));//车场位置Y坐标
				deports.add(newDep);
				limitTime=Double.parseDouble(lineArray[a+8]);
			}
		}
		finally{
			br.close();
		}
	}

}
